home *** CD-ROM | disk | FTP | other *** search
- {
- NB>{Hello All! I've recently coded this screen saver.It really looks like
- NB>snow is falling all over, don't you think?
-
- Yeah, it looked pretty neat!
-
- NB>However, I did not set out to do a snow screen saver and if you exp
- NB>with it a little you will see that it can even turn out to be a fir
- NB>If anyone can improve this code or make anything out of it, I would
- NB>very pleased to have a copy of the source.
-
- Ok, I played around with it a bit today, and following is my modified
- version. I pretty much just cleaned it up, got rid of all the unused
- variables and stuff (there were quite a few <G>) for readability,
- simplified a the calculations, and removed a lot of the overhead, and
- removed most of the global variables. You will see that now you can
- have a lot more snowflakes without it bogging out. I also removed the
- custom palette because you can get pretty much the same colours using
- the default palette (indexes 19-31). It can probably be simplified
- even further (ie. remove the x and y tables and just use newPos table).
- Oh yeah, I threw in a little snowflake explosion at the start too :-).
-
- (********************************************************************
- Originally by : Nick Batalas, 14-6-1994
- Modifications by : Eric Coolman, 19-6-1994
- ********************************************************************)
- }
-
- Program SnowFall;
- Uses crt; { for keypressed only }
-
- const
- Flakes = 500; { try less flakes for faster snowfall }
-
- {---------------- Stuff not specific to snowfall ----------------}
- Procedure vidMode(mode : byte);assembler;
- asm mov ah,$00; mov al,mode; int 10h; end;
-
- Procedure setPixel(pixPos : word; color : byte);
- begin
- mem[$A000:pixPos] := color;
- end;
-
- {---------------------------MAIN PROGRAM-------------------------}
-
- var
- CurFlake : integer; { snowflake counter }
- i : longint; { to add velocity to flakes }
- x,y, newPos: array[0..Flakes] of word; { lookup tables }
- BEGIN
- randomize;
- for curFlake:=0 to Flakes do { set up snow lookup table }
- begin
- x[curFlake]:=random(319);
- y[curFlake]:=random(199);
- end;
-
- vidMode($13); { 320x200x256 graphics mode }
-
- i := 0; { change to 100 or higher to get rid of start explosion }
-
- repeat
- inc(i);
-
- for curFlake:=0 to Flakes do
- begin
- setPixel(newPos[curFlake], 0); { erase old snowflake }
- newPos[curFlake] := { set up and draw new snowflake }
- round(x[curFlake]*(i*0.01)) + { new X }
- round(y[curFlake]*(i*0.01)) * 320; { new Y }
- setPixel(newPos[curFlake], (curFlake mod 13) + 19);
- end;
-
- while (port[$3da] and $08) = $08 do; { wait for vRetrace to }
- while (port[$3da] and $08) = $00 do; { start and end }
- until keypressed;
-
- vidMode($03); { return to 80x25 textmode }
- end.
-